package it.prova.type;

import it.prova.Consts;
import it.prova.Utility;

import java.util.List;

import nu.xom.Document;

import org.eclipse.jst.jsf.metadataprocessors.features.IDefaultValue;
import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
import org.eclipse.jst.jsf.metadataprocessors.features.PossibleValue;
import org.eclipse.jst.jsf.metadataprocessors.features.ValidationMessage;
import org.eclipse.jst.jsf.taglibprocessing.attributevalues.EnumerationType;

@SuppressWarnings("unchecked")
public class MyAttributeValueRuntimeType extends EnumerationType implements IValidValues, IPossibleValues, IDefaultValue
{	
	private Document currentModel;
	
//	private IFile currentOpenFile;
	
	@Override
	public boolean isValidValue(String value)
	{
		if(value.length() == 0)
		{
			getValidationMessages().add(new ValidationMessage("The 'name' attribute must be a non-zero length String."));
			return false;
		}
		else
		{
			return true;
		}
//		List<PossibleValue> values = getPossibleValues();
//		
//		if(values != null)
//		{
//			for(PossibleValue val: values)
//			{
//				if(val.getValue().equals(value))
//				{
//					return true;
//				}
//			}
//			return false;
//		}
//		else
//		{
//			return false;
//		}
	}

	@Override
	protected String getReturnType()
	{
		return "it.prova.type.MyAttributeValueRuntimeType";
	}
	
	public List<PossibleValue> getPossibleValues()
	{
//		String defaultValue = getDefaultValue();
//		System.out.println("defaultValue = " + defaultValue);
		
//		IWorkbench wb = PlatformUI.getWorkbench();
//		IWorkbenchWindow win = wb.getActiveWorkbenchWindow();
//		IWorkbenchPage page = win.getActivePage();
//		IEditorInput editor = page.getActiveEditor().getEditorInput();
//		IFileEditorInput fileEditor = (IFileEditorInput) editor;
//		IFile file = fileEditor.getFile();
//		String fileName = file.getName();
		
//		IStructuredDocumentContext context = getStructuredDocumentContext();
//		IWorkspaceContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(getStructuredDocumentContext());
//		IProject proj = resolver.getProject();
		
		currentModel = Utility.getCurrentModel(Consts.DATA_UNIT);
		
		//String fileName = currentOpenFile.getName();;
		//System.out.println("fileName = " + fileName);
		//String extension = currentOpenFile.getFileExtension();
		//System.out.println("extension = " + extension);
		//String prefix = fileName.substring(0, fileName.indexOf(extension));
		//System.out.println("prefix = " + prefix);
		//String templateFile = prefix + "template";
		//System.out.println("templateFile = " + templateFile);
		
//		IPath fullPath = currentOpenFile.getLocation();
//		System.out.println("fullPath = " + fullPath.toString());
//		
//		String newFilePath = fullPath.toString().substring(0, fullPath.toString().lastIndexOf(".")+1);
//		System.out.println("newFilePath = " + newFilePath);
//		String newFileFullPath = newFilePath + TEMPLATE_FILE_EXTENSION;
//		System.out.println("newFileFullPath = " + newFileFullPath);
//		
//		IFileSystem fileSystem = EFS.getLocalFileSystem();
//		IFileStore fileStore = fileSystem.getStore(fullPath);
//		
//		URI uri = URI.create(newFileFullPath);
//		IFileStore newFileStore = fileSystem.getStore(uri);
//		IFileInfo newFileInfo = newFileStore.fetchInfo();
//		
//		if(!newFileInfo.exists())
//		{
//			try
//			{
//				fileStore.copy(newFileStore, EFS.NONE, null);
//			}
//			catch(Exception e)
//			{
//				e.printStackTrace();
//			}
//		}
		
//		List<PossibleValue> possibleValues = getMDPossibleValuesForDisplay();
//		for(PossibleValue possibleValue: possibleValues)
//		{
//			System.out.println("possibleValue = " + possibleValue.getValue() + "/" + possibleValue.getDisplayValue());
//		}
		
//		Elements attributes = currentModel.getRootElement().getChildElements("attribute");
//		
//		List<PossibleValue> values = new ArrayList<PossibleValue>();
//		for(int i=0; i<attributes.size(); i++)
//		{
//			values.add(new PossibleValue(attributes.get(i).getAttribute("name").getValue()));
//		}
		
		//values.add(new PossibleValue("pippo", "displayPippo"));
		//values.add(new PossibleValue("pluto", "dispalyPluto"));
		
//		return values;
		return Utility.getPossibleValues(currentModel);
	}
}